package com
{
	import com.hsh.acte.Actif;
	import com.hsh.acte.Clic;
	import com.hsh.acte.ClicDroit;
	import com.hsh.acte.Mouvement;
	import com.hsh.acte.MouvementDans;
	import com.hsh.acte.Pression;
	import com.hsh.acte.Redimension;
	import com.hsh.graph.Etat;
	import com.hsh.graph.Pos;
	import com.hsh.graph.Style;
	import com.hsh.graph.Visuel;
	import com.hsh.txt.Champ;
	import com.hsh.txt.Etiquette;
	import com.hsh.txt.Run;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.utils.Timer;
	
	/**
	 * Page de garde...
	 * @author Jean-Marie@home
	 */
	public class UiEngineViewer extends Sprite
	{
		private var styleBouton:Style = new Style(0x6666ff, 0x000099, 0xFFFFFF, 0x0000DD, 0x9999FF, 0xCC66CC, 0xff99ff, 0x666666, 1.0, 0.2);
		private var styleFenetre:Style = new Style(0x66CC66, 0x009900, 0xFFFFFF, 0x339933, 0xAACCAA, 0x339933, 0x99ff99, 0x666666, 0.6, 0.6, 1.0, 0.0, 45);
		private var styleAccueil:Style = new Style(0xCC6666, 0x990000, 0xFFFFFF, 0x993333, 0xCCAAAA, 0x993333, 0xff9999, 0x666666);
		private var nbLivres:uint = 0;
		private var fond:Visuel;
		private var biblio:Visuel;
		private var corbeille:Visuel;
		private var info:Etiquette;
		private var cpt:Visuel;
		private var t:Timer = new Timer(200, 0);
		private var clic_droit:ClicDroit; 
		
		public function UiEngineViewer()
		{
			info = new Etiquette(this, 10, 580, 800, 20, "Ui Engine Viewer 1.0");
			
			// Création d'un Cadre redimensionnable en arrière-plan
			
			fond = new Visuel("fond", this, 5, 5, 800, 400, 20, null);
			fond.style.coulFond = 0x666699;
			clic_droit = new ClicDroit(fond, 200, creerLivre);
			var hlp:String = "Créez des livres (bouton de droite) et déplacez-les...";
			fond.eti = new Champ(fond, hlp, Pos.CENTRE, Pos.BAS);
			
			// Création d'un cadre (de type fenêtre) transportable
			
			var grand:Visuel = new Visuel("Cadre Vert", fond, 10, 10, 250, 150, 0, styleFenetre, true);
			new Mouvement(grand, infoVisuel);
			grand.eti = new Champ(grand, "Déplaçable", Pos.DROITE);
			grand.filtrer("relief", "ombre");
			
			// Création d'un cadre (de type fenêtre) redimensionnable
			
			var moyen:Visuel = new Visuel("Cadre Rose", fond, 280, 80, 180, 50, 30, styleAccueil);
			new Redimension(moyen, infoVisuel);
			moyen.eti = new Champ(moyen, "Redimensionnable", Pos.CENTRE, Pos.BAS);

			// Création d'un rectangle cliquable (de type bouton)
			
			var petit:Visuel = new Visuel("Cadre bleu", fond, 500, 100, 100, 100, 20, styleBouton, true);
			petit.eti = new Champ(petit, "Cliquable");
			new Clic(petit, infoVisuel);
			petit.filtrer("ombre");
			
			// Exemple de compteur modifiable sans saisie 
			// la distance modifie la vitesse et la direction modifie le sens 
			
			cpt = new Visuel("Compteur", fond, 0, 0, 70, 40, 20, styleBouton, true);
			var press:Pression = new Pression(cpt, surCompteur);
			cpt.pousser(fond.largeur-5, fond.hauteur-5);
			cpt.eti = new Champ(cpt, "0");
			cpt.eti.formater("cambria", 22, 0xff00ff, 0.8, true);
			cpt.filtrer("relief");

			// Cadres d'accueil : "bibliothèque" et "corbeille"
			
			biblio = new Visuel("bibliothèque", this, 0, 10, 180, 370, 0, styleAccueil);
			biblio.droite = 1014;
			biblio.eti = new Champ(biblio, "Bibliothèque", Pos.CENTRE, Pos.HAUT);
			biblio.filtrer("relief");
			
			corbeille = new Visuel("corbeille", this, 0, 0, 180, 80, 0, styleBouton);
			corbeille.pousser(1014, 590);
			corbeille.eti = new Champ(corbeille, "Corbeille", Pos.CENTRE, Pos.BAS);
			corbeille.filtrer("creux");
		}

		private function surCompteur(cpt:Visuel, e:Event):void
		{
			if (cpt.etat == Etat.ENFONCEMENT)
			{
				t.addEventListener(TimerEvent.TIMER, surTimer);
				t.start();
			}
			if (cpt.etat == Etat.RELACHEMENT)
			{
				t.removeEventListener(TimerEvent.TIMER, surTimer);
				t.stop();
			}
		}
		
		/**
		 * Expérimentation Timer sur compteur
		 * @param	t	ralenti pour réglage 
		 */
		private function surTimer(t:TimerEvent):void
		{
			var val:Number = parseFloat(cpt.eti.texte);
			var souris:Point = new Point(cpt.sourisX - cpt.milieuX, cpt.sourisY - cpt.milieuY);
			var distance:Number = Point.distance(new Point(cpt.sourisX, cpt.sourisY), new Point(cpt.milieuX, cpt.milieuY));
			distance += 20;
			distance /= 20;
			if (souris.y >= 0) 
				val +=distance;
			else
				val -=distance;
		
			cpt.eti.texte = String(int(val));			
		}
		
		private function creerLivre(a:Actif, e:MouseEvent):void
		{
			if (numChildren > 8) 
			{
				pieceSuivante();
				return;
			}
			var pourJeter:Boolean = Math.random() * 8 < 4;
			var menu:Visuel = new Visuel("livre_" + String(numChildren - 3), this, 
										a.sceneX - 20, a.sceneY - 10, 120, 28, 28, 
										pourJeter ? styleBouton : styleAccueil);
			menu.enModeBouton = true;
			menu.etiqueter(menu.id, Pos.DROITE, Pos.BAS);
			new ClicDroit(menu, 200, consulterLivre);
			new MouvementDans(menu, pourJeter ? corbeille : biblio, surMouvementDans);
		}
		
		private function surMouvementDans(a:Visuel, c:Visuel, e:Event):void
		{
			tracer(a.id, "placé dans la", c.id);
			if (c == biblio)
			{
				nbLivres ++;
				a.sur(this, biblio.gauche + 30, biblio.haut + int(a.id.substr(6)) * 32);
				new MouvementDans(a, corbeille, surMouvementDans);
				a.filtrer("ombre");
				
			} else 
			{
				if (a.style == styleAccueil) nbLivres --;
				a.detruire();
			}
		}
		
		private function consulterLivre(a:Visuel, e:Event):void
		{
			tracer("Lecture du livre", a.id)
		}
		private function infoVisuel(v:Visuel, e:Event):void
		{
			if (v.largeur < 20) v.largeur = 20;
			if (v.hauteur < 20) v.hauteur = 20;
			tracer(v.id, v.gauche, v.haut, v.largeur, v.hauteur, v.etat);
		}
		
		private function tracer(...textes):void
		{
			fond.eti.texte = textes.join(" ");
			fond.mettreDerriere();
		}
		
		private function pieceSuivante():void
		{
			tracer("Il y a assez de livres comme ça !");
			clic_droit.detruire();
		}
	}
}